/*!
 * \file WTSTradeDef.hpp
 * \project	WonderTrader
 *
 * \author Wesley
 * \date 2020/03/30
 * 
 * \brief WonderTrader交易数据定义文件
 * 
 * \details 本文件定义了WonderTrader框架中交易相关的核心数据类：
 *          - WTSEntrust：委托数据结构，用于下单委托
 *          - WTSEntrustAction：委托操作类，用于撤单等委托操作
 *          - WTSOrderInfo：委托订单信息类，记录委托状态和执行情况
 *          - WTSTradeInfo：成交信息类，记录成交明细
 *          - WTSPositionItem：持仓信息类，管理持仓数据
 *          - WTSAccountInfo：账户信息类，管理资金和保证金信息
 *          
 *          这些类使用对象池技术进行内存管理，提高了高频交易场景下的性能。
 *          支持多种交易类型、开平仓操作、风险控制等交易系统核心功能。
 */
#pragma once
#include "WTSObject.hpp"
#include "WTSTypes.h"
#include "WTSMarcos.h"

#include <time.h>
#include <string>
#include <map>
#include<chrono>

NS_WTP_BEGIN
class WTSContractInfo;

//////////////////////////////////////////////////////////////////////////
/*!
 * \brief 委托数据结构类
 * 
 * \details 用于处理客户委托下单请求的核心类，包含：
 *          - 基础委托信息：合约代码、交易所、价格、数量等
 *          - 委托属性：买卖方向、价格类型、开平标志、委托标志等
 *          - 业务类型：现货、期货等不同交易类型
 *          - 净持仓支持：支持净持仓模式的买卖操作
 *          - 用户标签：支持用户自定义标签和委托编号
 *          
 *          使用对象池技术管理内存，适用于高频交易场景。
 *          
 * \author Wesley
 * \date 2020/03/30
 */
/*!
 * \brief 委托信息类
 * 
 * \details 用于创建和管理交易委托的核心类，包含：
 *          - 基础信息：合约代码、交易所、价格、数量等
 *          - 交易属性：买卖方向、价格类型、开平仓标志、订单标志等
 *          - 用户标识：委托编号、用户标签等自定义信息
 *          - 业务类型：支持现货、期货等不同业务类型
 *          - 净持仓支持：支持净持仓模式的买卖操作
 *          
 *          该类是交易系统中委托订单的数据载体，通过该类创建的委托对象
 *          可以被提交到交易所进行下单操作。支持多种价格类型和订单类型，
 *          适配不同交易所的委托规则和要求。
 *          
 * \author Wesley
 * \date 2020/03/30
 */
class WTSEntrust : public WTSPoolObject<WTSEntrust>
{
public:
	WTSEntrust()
		: m_iPrice(0)
		, m_dVolume(0)
		, m_businessType(BT_CASH)
		, m_direction(WDT_LONG)
		, m_priceType(WPT_ANYPRICE)
		, m_orderFlag(WOF_NOR)
		, m_offsetType(WOT_OPEN)
		, m_bIsNet(false)
		, m_bIsBuy(true)
		, m_pContract(NULL)
	{
	}

	virtual ~WTSEntrust(){}

public:
	/*!
	 * \brief 创建委托对象
	 * \param code 合约代码
	 * \param vol 委托数量
	 * \param price 委托价格
	 * \param exchg 交易所代码，默认为空
	 * \param bType 业务类型，默认为现货
	 * \return 委托对象指针，失败返回NULL
	 */
	static inline WTSEntrust* create(const char* code, double vol, double price, const char* exchg = "", WTSBusinessType bType = BT_CASH)
	{
		WTSEntrust* pRet = WTSEntrust::allocate();
		if(pRet)
		{
			//wt_strcpy(pRet->m_strExchg, exchg);
			//wt_strcpy(pRet->m_strCode, code);

			auto len = strlen(exchg);
			memcpy(pRet->m_strExchg, exchg, len);
			pRet->m_strExchg[len] = 0;

			len = strlen(code);
			memcpy(pRet->m_strCode, code, len);
			pRet->m_strCode[len] = 0;

			pRet->m_dVolume = vol;
			pRet->m_iPrice = price;
			pRet->m_businessType = bType;
			return pRet;
		}

		return NULL;
	}

public:
	/*!
	 * \brief 设置合约基础信息
	 * \details 用于设置委托的合约代码和交易所信息
	 */
	inline void setExchange(const char* exchg, std::size_t len = 0)				///< 设置交易所代码
	{
		wt_strcpy(m_strExchg, exchg, len);
    }
	inline void setCode(const char* code, std::size_t len = 0)					///< 设置合约代码
	{
		wt_strcpy(m_strCode, code, len);
    }

	/*!
	 * \brief 设置委托交易属性
	 * \details 用于设置委托的交易方向、价格类型、订单标志和开平仓标志
	 */
	inline void setDirection(WTSDirectionType dType){m_direction = dType;}		///< 设置买卖方向
	inline void setPriceType(WTSPriceType pType){m_priceType = pType;}			///< 设置价格类型（市价/限价等）
	inline void setOrderFlag(WTSOrderFlag oFlag){m_orderFlag = oFlag;}			///< 设置订单标志
	inline void setOffsetType(WTSOffsetType oType){m_offsetType = oType;}		///< 设置开平仓标志

	/*!
	 * \brief 获取委托交易属性
	 * \details 用于获取委托的交易方向、价格类型、订单标志和开平仓标志
	 */
	inline WTSDirectionType	getDirection() const{return m_direction;}			///< 获取买卖方向
	inline WTSPriceType		getPriceType() const{return m_priceType;}			///< 获取价格类型
	inline WTSOrderFlag		getOrderFlag() const{return m_orderFlag;}			///< 获取订单标志
	inline WTSOffsetType	getOffsetType() const{return m_offsetType;}		///< 获取开平仓标志

	/*!
	 * \brief 业务类型管理
	 * \details 用于设置和获取业务类型（现货/期货等）
	 */
	inline void setBusinessType(WTSBusinessType bType) { m_businessType = bType; }	///< 设置业务类型
	inline WTSBusinessType	getBusinessType() const { return m_businessType; }	///< 获取业务类型

	/*!
	 * \brief 设置委托价格和数量
	 * \details 用于设置委托的价格和数量信息
	 */
	inline void setVolume(double volume){ m_dVolume = volume; }					///< 设置委托数量
	inline void setPrice(double price){ m_iPrice = price; }					///< 设置委托价格

	/*!
	 * \brief 获取委托价格和数量
	 * \details 用于获取委托的价格和数量信息
	 */
	inline double getVolume() const{ return m_dVolume; }						///< 获取委托数量
	inline double getPrice() const{ return m_iPrice; }						///< 获取委托价格

	/*!
	 * \brief 获取合约基础信息
	 * \details 用于获取委托的合约代码和交易所信息
	 */
	inline const char* getCode() const { return m_strCode; }					///< 获取合约代码
	inline const char* getExchg() const { return m_strExchg; }				///< 获取交易所代码

	/*!
	 * \brief 委托编号管理
	 * \details 用于设置和获取委托编号
	 */
	inline void setEntrustID(const char* eid) { wt_strcpy(m_strEntrustID, eid); }	///< 设置委托编号
	inline const char* getEntrustID() const { return m_strEntrustID; }		///< 获取委托编号（只读）
	inline char* getEntrustID() { return m_strEntrustID; }					///< 获取委托编号（可写）

	/*!
	 * \brief 用户标签管理
	 * \details 用于设置和获取用户自定义标签
	 */
	inline void setUserTag(const char* tag) { wt_strcpy(m_strUserTag, tag); }		///< 设置用户标签
	inline const char* getUserTag() const { return m_strUserTag; }			///< 获取用户标签（只读）
	inline char* getUserTag() { return m_strUserTag; }						///< 获取用户标签（可写）

	/*!
	 * \brief 净持仓模式支持
	 * \details 用于支持净持仓模式的买卖操作
	 */
	inline void setNetDirection(bool isBuy) { m_bIsNet = true; m_bIsBuy = isBuy; }	///< 设置净持仓方向
	inline bool isNet() const { return m_bIsNet; }							///< 判断是否为净持仓模式
	inline bool isBuy() const { return m_bIsBuy; }							///< 判断是否为买入方向

	/*!
	 * \brief 合约信息关联
	 * \details 用于关联合约的详细信息
	 */
	inline void setContractInfo(WTSContractInfo* cInfo) { m_pContract = cInfo; }	///< 设置合约信息
	inline WTSContractInfo* getContractInfo() const { return m_pContract; }		///< 获取合约信息

protected:
	char			m_strExchg[MAX_EXCHANGE_LENGTH];
	char			m_strCode[MAX_INSTRUMENT_LENGTH];
	double			m_dVolume;
	double			m_iPrice;

	bool			m_bIsNet;
	bool			m_bIsBuy;

	WTSDirectionType	m_direction;
	WTSPriceType		m_priceType;
	WTSOrderFlag		m_orderFlag;
	WTSOffsetType		m_offsetType;

	char				m_strEntrustID[64];
	char				m_strUserTag[64];

	WTSBusinessType		m_businessType;

	WTSContractInfo*	m_pContract;
};


//////////////////////////////////////////////////////////////////////////
/*!
 * \brief 委托操作类
 * 
 * \details 用于处理委托相关操作的类，主要功能包括：
 *          - 撤单操作：取消已提交的委托订单
 *          - 改单操作：修改委托的价格和数量（如果交易所支持）
 *          - 委托查询：查询委托状态和执行情况
 *          
 *          支持通过委托编号或订单编号来执行操作，
 *          适用于各种交易所的委托管理需求。
 *          
 * \author Wesley
 * \date 2020/03/30
 */
class WTSEntrustAction : public WTSPoolObject<WTSEntrustAction>
{
public:
	WTSEntrustAction()
		: m_iPrice(0)
		, m_dVolume(0)
		, m_actionFlag(WAF_CANCEL)
		, m_businessType(BT_CASH)
	{

	}

	virtual ~WTSEntrustAction(){}

public:
	/*!
	 * \brief 创建委托操作对象
	 * \param code 合约代码
	 * \param exchg 交易所代码，默认为空
	 * \param vol 操作数量，默认为0（用于改单）
	 * \param price 操作价格，默认为0（用于改单）
	 * \param bType 业务类型，默认为现货
	 * \return 委托操作对象指针，失败返回NULL
	 */
	static inline WTSEntrustAction* create(const char* code, const char* exchg = "", double vol = 0, double price = 0, WTSBusinessType bType = BT_CASH)
	{
		WTSEntrustAction* pRet = WTSEntrustAction::allocate();
		if(pRet)
		{
			wt_strcpy(pRet->m_strExchg, exchg);
			wt_strcpy(pRet->m_strCode, code);
			pRet->m_dVolume = vol;
			pRet->m_iPrice = price;
			pRet->m_businessType = bType;
			return pRet;
		}

		return NULL;
	}

	/*!
	 * \brief 创建撤单操作对象
	 * \param eid 委托编号
	 * \param oid 订单编号
	 * \return 撤单操作对象指针，失败返回NULL
	 */
	static inline WTSEntrustAction* createCancelAction(const char* eid, const char* oid)
	{
		WTSEntrustAction* pRet = new WTSEntrustAction;
		if(pRet)
		{
			wt_strcpy(pRet->m_strEnturstID, eid);
			wt_strcpy(pRet->m_strOrderID, oid);
			return pRet;
		}

		return NULL;
	}

public:
	/*!
	 * \brief 设置操作的价格和数量
	 * \details 用于改单操作时设置新的价格和数量
	 */
	inline void setVolume(double volume){ m_dVolume = volume; }				///< 设置操作数量
	inline void setPrice(double price){ m_iPrice = price; }				///< 设置操作价格

	/*!
	 * \brief 获取操作的价格和数量
	 * \details 用于获取改单操作的价格和数量信息
	 */
	inline double getVolume() const{ return m_dVolume; }					///< 获取操作数量
	inline double getPrice() const{ return m_iPrice; }					///< 获取操作价格

	/*!
	 * \brief 获取合约基础信息
	 * \details 用于获取操作对象的合约代码和交易所信息
	 */
	inline const char* getExchg() const { return m_strExchg; }				///< 获取交易所代码
	inline const char* getCode() const{return m_strCode;}					///< 获取合约代码

	/*!
	 * \brief 设置合约基础信息
	 * \details 用于设置操作对象的合约代码和交易所信息
	 */
	inline void setExchange(const char* exchg, std::size_t len = 0) {		///< 设置交易所代码
		if (len == 0)
			wt_strcpy(m_strExchg, exchg);
		else
			strncpy(m_strExchg, exchg, len);
	}
	inline void setCode(const char* code, std::size_t len = 0) {			///< 设置合约代码
		if (len == 0)
			wt_strcpy(m_strCode, code);
		else
			strncpy(m_strCode, code, len);
	}

	/*!
	 * \brief 操作标志管理
	 * \details 用于设置和获取操作类型（撤单/改单等）
	 */
	inline void setActionFlag(WTSActionFlag af){m_actionFlag = af;}			///< 设置操作标志
	inline WTSActionFlag getActionFlag() const{return m_actionFlag;}		///< 获取操作标志

	/*!
	 * \brief 委托编号管理
	 * \details 用于设置和获取要操作的委托编号
	 */
	inline void setEntrustID(const char* eid) { wt_strcpy(m_strEnturstID, eid); }	///< 设置委托编号
	inline const char* getEntrustID() const{return m_strEnturstID;}		///< 获取委托编号

	/*!
	 * \brief 订单编号管理
	 * \details 用于设置和获取要操作的订单编号
	 */
	inline void setOrderID(const char* oid) { wt_strcpy(m_strOrderID, oid); }		///< 设置订单编号
	inline const char* getOrderID() const{return m_strOrderID;}			///< 获取订单编号

	/*!
	 * \brief 业务类型管理
	 * \details 用于设置和获取业务类型
	 */
	inline void setBusinessType(WTSBusinessType bType) { m_businessType = bType; }	///< 设置业务类型
	inline WTSBusinessType	getBusinessType() const { return m_businessType; }	///< 获取业务类型

protected:
	char			m_strExchg[MAX_EXCHANGE_LENGTH];
	char			m_strCode[MAX_INSTRUMENT_LENGTH];
	double			m_dVolume;
	double			m_iPrice;

	char			m_strEnturstID[64];
	WTSActionFlag	m_actionFlag;

	char			m_strOrderID[64];

	WTSBusinessType		m_businessType;
};

//////////////////////////////////////////////////////////////////////////
/*!
 * \brief 委托订单信息类
 * 
 * \details 用于跟踪和管理委托订单状态变化的类，包含：
 *          - 订单基础信息：合约代码、交易所、价格、数量等（继承自委托信息）
 *          - 订单状态管理：订单状态、订单类型、提交时间等
 *          - 成交信息：已成交数量、剩余数量、成交明细等
 *          - 错误处理：订单错误状态和错误信息记录
 *          - 生命周期管理：判断订单是否存活、是否可撤单等
 *          
 *          该类可以从WTSEntrust委托对象创建，用于监控订单执行过程。
 *          
 * \author Wesley
 * \date 2020/03/30
 */
class WTSOrderInfo : public WTSPoolObject<WTSOrderInfo>
{
public:
	WTSOrderInfo()
		:m_orderState(WOS_Submitting)
		,m_orderType(WORT_Normal)
		,m_uInsertDate(0)
		,m_uInsertTime(0)
		,m_dVolTraded(0)
		,m_dVolLeft(0)
		,m_bIsError(false)
	{

	}

	virtual ~WTSOrderInfo(){}

public:
	/*!
	 * \brief 创建订单信息对象
	 * \param entrust 委托对象指针，如果不为NULL则从委托对象复制信息，默认为NULL
	 * \return 订单信息对象指针
	 * \details 如果传入委托对象，则会复制委托的所有相关信息到订单中，
	 *          包括合约代码、价格、数量、交易属性等，用于跟踪委托的执行状态
	 */
	static inline WTSOrderInfo* create(WTSEntrust* entrust = NULL)
	{
		WTSOrderInfo *pRet = WTSOrderInfo::allocate();

		if(entrust != NULL)
		{
			wt_strcpy(pRet->m_strCode, entrust->getCode());
			wt_strcpy(pRet->m_strExchg,entrust->getExchg());
			pRet->m_iPrice = entrust->getPrice();
			pRet->m_dVolume = entrust->getVolume();

			pRet->m_direction = entrust->getDirection();
			pRet->m_offsetType = entrust->getOffsetType();
			pRet->m_orderFlag = entrust->getOrderFlag();
			pRet->m_priceType = entrust->getPriceType();
			wt_strcpy(pRet->m_strEntrustID, entrust->getEntrustID());
			wt_strcpy(pRet->m_strUserTag, entrust->getUserTag());

			pRet->m_dVolLeft = entrust->getVolume();
			pRet->m_businessType = entrust->getBusinessType();
		}

		return pRet;
	}

public:
	/*!
	 * \brief 设置合约基础信息
	 * \details 这些方法与WTSEntrust类相同，用于管理订单的合约信息
	 */
	inline void setExchange(const char* exchg, std::size_t len = 0) {		///< 设置交易所代码
		if (len == 0)
			wt_strcpy(m_strExchg, exchg);
		else
			strncpy(m_strExchg, exchg, len);
	}
	inline void setCode(const char* code, std::size_t len = 0) {			///< 设置合约代码
		if (len == 0)
			wt_strcpy(m_strCode, code);
		else
			strncpy(m_strCode, code, len);
	}

	/*!
	 * \brief 设置订单交易属性
	 * \details 用于设置订单的交易方向、价格类型、订单标志和开平仓标志
	 */
	inline void setDirection(WTSDirectionType dType) { m_direction = dType; }		///< 设置买卖方向
	inline void setPriceType(WTSPriceType pType) { m_priceType = pType; }			///< 设置价格类型
	inline void setOrderFlag(WTSOrderFlag oFlag) { m_orderFlag = oFlag; }			///< 设置订单标志
	inline void setOffsetType(WTSOffsetType oType) { m_offsetType = oType; }		///< 设置开平仓标志

	/*!
	 * \brief 获取订单交易属性
	 * \details 用于获取订单的交易方向、价格类型、订单标志和开平仓标志
	 */
	inline WTSDirectionType	getDirection() const { return m_direction; }			///< 获取买卖方向
	inline WTSPriceType		getPriceType() const { return m_priceType; }			///< 获取价格类型
	inline WTSOrderFlag		getOrderFlag() const { return m_orderFlag; }			///< 获取订单标志
	inline WTSOffsetType	getOffsetType() const { return m_offsetType; }		///< 获取开平仓标志

	/*!
	 * \brief 业务类型管理
	 * \details 用于设置和获取业务类型
	 */
	inline void setBusinessType(WTSBusinessType bType) { m_businessType = bType; }	///< 设置业务类型
	inline WTSBusinessType	getBusinessType() const { return m_businessType; }	///< 获取业务类型

	/*!
	 * \brief 设置订单价格和数量
	 * \details 用于设置订单的价格和数量信息
	 */
	inline void setVolume(double volume) { m_dVolume = volume; }					///< 设置订单数量
	inline void setPrice(double price) { m_iPrice = price; }						///< 设置订单价格

	/*!
	 * \brief 获取订单价格和数量
	 * \details 用于获取订单的价格和数量信息
	 */
	inline double getVolume() const { return m_dVolume; }							///< 获取订单数量
	inline double getPrice() const { return m_iPrice; }							///< 获取订单价格

	/*!
	 * \brief 获取合约基础信息
	 * \details 用于获取订单的合约代码和交易所信息
	 */
	inline const char* getCode() const { return m_strCode; }						///< 获取合约代码
	inline const char* getExchg() const { return m_strExchg; }					///< 获取交易所代码

	/*!
	 * \brief 委托编号管理
	 * \details 用于设置和获取委托编号
	 */
	inline void setEntrustID(const char* eid) { wt_strcpy(m_strEntrustID, eid); }	///< 设置委托编号
	inline const char* getEntrustID() const { return m_strEntrustID; }			///< 获取委托编号（只读）
	inline char* getEntrustID() { return m_strEntrustID; }						///< 获取委托编号（可写）

	/*!
	 * \brief 用户标签管理
	 * \details 用于设置和获取用户自定义标签
	 */
	inline void setUserTag(const char* tag) { wt_strcpy(m_strUserTag, tag); }		///< 设置用户标签
	inline const char* getUserTag() const { return m_strUserTag; }				///< 获取用户标签（只读）
	inline char* getUserTag() { return m_strUserTag; }							///< 获取用户标签（可写）

	/*!
	 * \brief 净持仓模式支持
	 * \details 用于支持净持仓模式的买卖操作
	 */
	inline void setNetDirection(bool isBuy) { m_bIsNet = true; m_bIsBuy = isBuy; }	///< 设置净持仓方向
	inline bool isNet() const { return m_bIsNet; }								///< 判断是否为净持仓模式
	inline bool isBuy() const { return m_bIsBuy; }								///< 判断是否为买入方向

	/*!
	 * \brief 合约信息关联
	 * \details 用于关联合约的详细信息
	 */
	inline void setContractInfo(WTSContractInfo* cInfo) { m_pContract = cInfo; }	///< 设置合约信息
	inline WTSContractInfo* getContractInfo() const { return m_pContract; }		///< 获取合约信息

public:
	/*!
	 * \brief 设置订单执行信息
	 * \details 用于设置订单的执行过程中的各种信息
	 */
	inline void	setOrderDate(uint32_t uDate){m_uInsertDate = uDate;}			///< 设置订单日期
	inline void	setOrderTime(uint64_t uTime){m_uInsertTime = uTime;}			///< 设置订单时间
	inline void	setVolTraded(double vol){ m_dVolTraded = vol; }					///< 设置已成交数量
	inline void	setVolLeft(double vol){ m_dVolLeft = vol; }						///< 设置剩余数量
	
	inline void	setOrderID(const char* oid) { wt_strcpy(m_strOrderID, oid); }		///< 设置订单编号
	inline void	setOrderState(WTSOrderState os){m_orderState = os;}				///< 设置订单状态
	inline void	setOrderType(WTSOrderType ot){m_orderType = ot;}					///< 设置订单类型

	/*!
	 * \brief 获取订单执行信息
	 * \details 用于获取订单的执行过程中的各种信息
	 */
	inline uint32_t getOrderDate() const{return m_uInsertDate;}					///< 获取订单日期
	inline uint64_t getOrderTime() const{return m_uInsertTime;}					///< 获取订单时间
	inline double getVolTraded() const{ return m_dVolTraded; }					///< 获取已成交数量
	inline double getVolLeft() const{ return m_dVolLeft; }						///< 获取剩余数量
    
	inline WTSOrderState		getOrderState() const { return m_orderState; }		///< 获取订单状态
	inline WTSOrderType			getOrderType() const { return m_orderType; }		///< 获取订单类型
	inline const char*			getOrderID() const { return m_strOrderID; }		///< 获取订单编号

	/*!
	 * \brief 订单状态消息管理
	 * \details 用于设置和获取订单状态描述信息
	 */
	inline void	setStateMsg(const char* msg){m_strStateMsg = msg;}				///< 设置状态消息
	inline const char* getStateMsg() const{return m_strStateMsg.c_str();}		///< 获取状态消息

	/*!
	 * \brief 订单生命周期判断
	 * \details 判断订单是否仍在活跃状态（未完全成交且未被取消）
	 * \return true 表示订单仍活跃，false 表示订单已结束
	 */
	inline bool	isAlive() const
	{
		switch(m_orderState)
		{
		case WOS_AllTraded:
		case WOS_Canceled:
			return false;
		default:
			return true;
		}
	}

	/*!
	 * \brief 订单错误状态管理
	 * \details 用于设置和获取订单是否发生错误
	 */
	inline void	setError(bool bError = true){ m_bIsError = bError; }			///< 设置错误状态
	inline bool	isError() const{ return m_bIsError; }							///< 获取错误状态

private:
	//�ⲿ�ֳ�Ա��WTSEntrustһ��
	char			m_strExchg[MAX_EXCHANGE_LENGTH];
	char			m_strCode[MAX_INSTRUMENT_LENGTH];
	double			m_dVolume;
	double			m_iPrice;

	bool			m_bIsNet;
	bool			m_bIsBuy;

	WTSDirectionType	m_direction;
	WTSPriceType		m_priceType;
	WTSOrderFlag		m_orderFlag;
	WTSOffsetType		m_offsetType;

	char				m_strEntrustID[64];
	char				m_strUserTag[64];

	WTSBusinessType		m_businessType;
	WTSContractInfo*	m_pContract;

	//�ⲿ����Orderר�еĳ�Ա
	uint32_t	m_uInsertDate;
	uint64_t	m_uInsertTime;
	double		m_dVolTraded;
	double		m_dVolLeft;
	bool		m_bIsError;

	WTSOrderState	m_orderState;
	WTSOrderType	m_orderType;
	char			m_strOrderID[64];
	std::string		m_strStateMsg;
};

//////////////////////////////////////////////////////////////////////////
/*!
 * \brief 成交信息类
 * 
 * \details 用于记录和管理交易成交信息的类，包含：
 *          - 成交基础信息：合约代码、成交价格、成交数量、成交金额等
 *          - 成交时间信息：成交日期、成交时间（精确到毫秒级）
 *          - 成交类型：普通成交、强制成交、组合成交等
 *          - 关联信息：关联的订单ID、成交ID、用户标签等
 *          - 交易属性：买卖方向、开平仓标志、订单类型等
 *          
 *          该类通常由交易系统在订单成交后创建，用于记录成交明细。
 *          支持净持仓模式和普通持仓模式的成交记录。
 *          
 * \author Wesley
 * \date 2020/03/30
 */
class WTSTradeInfo : public WTSPoolObject<WTSTradeInfo>
{
public:
	WTSTradeInfo()
		: m_orderType(WORT_Normal)
		, m_tradeType(WTT_Common)
		, m_uAmount(0)
		, m_dPrice(0)
		, m_businessType(BT_CASH)
		, m_pContract(NULL)
	{}
	virtual ~WTSTradeInfo(){}

public:
	/*!
	 * \brief 创建成交信息对象
	 * \param code 合约代码
	 * \param exchg 交易所代码，默认为空
	 * \param bType 业务类型，默认为现货
	 * \return 成交信息对象指针
	 */
	static inline WTSTradeInfo* create(const char* code, const char* exchg = "", WTSBusinessType bType = BT_CASH)
	{
		WTSTradeInfo *pRet = WTSTradeInfo::allocate();
		wt_strcpy(pRet->m_strExchg, exchg);
		wt_strcpy(pRet->m_strCode, code);
		pRet->m_businessType = bType;

		return pRet;
	}

	/*!
	 * \brief 设置成交信息基础数据
	 * \details 这些方法用于设置成交的核心信息
	 */
	inline void setTradeID(const char* tradeid) { wt_strcpy(m_strTradeID, tradeid); }		///< 设置成交编号
	inline void setRefOrder(const char* oid) { wt_strcpy(m_strRefOrder, oid); }			///< 设置关联订单编号
	
	inline void setDirection(WTSDirectionType dType){m_direction = dType;}					///< 设置买卖方向
	inline void setOffsetType(WTSOffsetType oType){m_offsetType = oType;}					///< 设置开平仓标志
	inline void setOrderType(WTSOrderType ot){m_orderType = ot;}							///< 设置订单类型
	inline void setTradeType(WTSTradeType tt){m_tradeType = tt;}							///< 设置成交类型

	inline void setVolume(double volume){m_dVolume = volume;}								///< 设置成交数量
	inline void setPrice(double price){ m_dPrice = price; }								///< 设置成交价格

	inline void setTradeDate(uint32_t uDate){m_uTradeDate = uDate;}						///< 设置成交日期
	inline void setTradeTime(uint64_t uTime){m_uTradeTime = uTime;}						///< 设置成交时间

	inline void setAmount(double amount){ m_uAmount = amount; }							///< 设置成交金额

	/*!
	 * \brief 获取成交信息方法组
	 * \details 这些方法用于获取成交的各种属性信息
	 */
	inline WTSDirectionType	getDirection() const{return m_direction;}						///< 获取买卖方向
	inline WTSOffsetType	getOffsetType() const{return m_offsetType;}					///< 获取开平仓标志
	inline WTSOrderType		getOrderType() const{return m_orderType;}						///< 获取订单类型
	inline WTSTradeType		getTradeType() const{return m_tradeType;}						///< 获取成交类型

	inline double getVolume() const{ return m_dVolume; }									///< 获取成交数量
	inline double getPrice() const{ return m_dPrice; }									///< 获取成交价格

	inline const char*	getCode() const { return m_strCode; }								///< 获取合约代码
	inline const char*	getExchg() const { return m_strExchg; }							///< 获取交易所代码
	inline const char*	getTradeID() const { return m_strTradeID; }						///< 获取成交编号
	inline const char*	getRefOrder() const { return m_strRefOrder; }						///< 获取关联订单编号

	inline uint32_t getTradeDate() const{return m_uTradeDate;}							///< 获取成交日期
	inline uint64_t getTradeTime() const{return m_uTradeTime;}							///< 获取成交时间

	inline double getAmount() const{ return m_uAmount; }									///< 获取成交金额

	/*!
	 * \brief 用户标签和业务类型方法
	 * \details 用于设置和获取用户自定义标签及业务类型
	 */
	inline void setUserTag(const char* tag) { wt_strcpy(m_strUserTag, tag); }				///< 设置用户标签
	inline const char* getUserTag() const { return m_strUserTag; }						///< 获取用户标签

	inline void setBusinessType(WTSBusinessType bType) { m_businessType = bType; }			///< 设置业务类型
	inline WTSBusinessType	getBusinessType() const { return m_businessType; }			///< 获取业务类型

	/*!
	 * \brief 净持仓模式支持方法
	 * \details 用于支持净持仓模式的买卖操作
	 */
	inline void setNetDirection(bool isBuy) { m_bIsNet = true; m_bIsBuy = isBuy; }			///< 设置净持仓方向
	inline bool isNet() const { return m_bIsNet; }										///< 判断是否为净持仓模式
	inline bool isBuy() const { return m_bIsBuy; }										///< 判断是否为买入方向

	/*!
	 * \brief 合约信息关联方法
	 * \details 用于关联合约的详细信息
	 */
	inline void setContractInfo(WTSContractInfo* cInfo) { m_pContract = cInfo; }			///< 设置合约信息
	inline WTSContractInfo* getContractInfo() const { return m_pContract; }				///< 获取合约信息

protected:
	char	m_strExchg[MAX_EXCHANGE_LENGTH];	//�г�
	char	m_strCode[MAX_INSTRUMENT_LENGTH];	//����
	char	m_strTradeID[64];					//�ɽ�����
	char	m_strRefOrder[64];					//����ί�����к�
	char	m_strUserTag[64];					//�û���ǩ

	uint32_t	m_uTradeDate;
	uint64_t	m_uTradeTime;
	double		m_dVolume;
	double		m_dPrice;

	bool		m_bIsNet;
	bool		m_bIsBuy;

	WTSDirectionType	m_direction;
	WTSOffsetType		m_offsetType;
	WTSOrderType		m_orderType;
	WTSTradeType		m_tradeType;

	double		m_uAmount;

	WTSBusinessType		m_businessType;
	WTSContractInfo*	m_pContract;
};

//////////////////////////////////////////////////////////////////////////
/*!
 * \brief 持仓信息类
 * 
 * \details 用于管理和维护交易持仓信息的类，包含：
 *          - 持仓数量管理：昨仓、今仓、可用数量、冻结数量等
 *          - 持仓成本计算：持仓成本、平均价格、持仓盈亏等
 *          - 保证金管理：占用保证金、动态盈亏计算
 *          - 持仓方向：多头、空头持仓区分
 *          - 期货特性：支持T+0交易的今昨仓区分
 *          
 *          该类区分昨仓（前一交易日持仓）和今仓（当日新增持仓），
 *          支持分别管理其可用数量，满足期货交易的开平仓规则。
 *          提供灵活的持仓查询和计算接口。
 *          
 * \author Wesley
 * \date 2020/03/30
 */
class WTSPositionItem : public WTSPoolObject<WTSPositionItem>
{
public:
	/*!
	 * \brief 创建持仓信息对象
	 * \param code 合约代码
	 * \param currency 币种，默认为人民币
	 * \param exchg 交易所代码，默认为空
	 * \param bType 业务类型，默认为现货
	 * \return 持仓信息对象指针
	 */
	static inline WTSPositionItem* create(const char* code, const char* currency = "CNY", const char* exchg = "", WTSBusinessType bType = BT_CASH)
	{
		WTSPositionItem *pRet = WTSPositionItem::allocate();
		wt_strcpy(pRet->m_strExchg, exchg);
		wt_strcpy(pRet->m_strCode, code);
		wt_strcpy(pRet->m_strCurrency, currency);
		pRet->m_businessType = bType;

		return pRet;
	}

	/*!
	 * \brief 设置持仓基础信息
	 * \details 用于设置持仓的基础数据，包括方向、数量、成本等
	 */
	inline void setDirection(WTSDirectionType dType){m_direction = dType;}					///< 设置持仓方向（多头/空头）
	inline void setPrePosition(double prePos){ m_dPrePosition = prePos; }					///< 设置昨仓数量
	inline void setNewPosition(double newPos){ m_dNewPosition = newPos; }					///< 设置今仓数量
	inline void setAvailPrePos(double availPos){ m_dAvailPrePos = availPos; }				///< 设置可用昨仓数量
	inline void setAvailNewPos(double availPos){ m_dAvailNewPos = availPos; }				///< 设置可用今仓数量
	inline void setPositionCost(double cost){m_dTotalPosCost = cost;}						///< 设置持仓总成本
	inline void setMargin(double margin){ m_dMargin = margin; }							///< 设置占用保证金
	inline void setAvgPrice(double avgPrice){ m_dAvgPrice = avgPrice; }					///< 设置持仓均价
	inline void setDynProfit(double profit){ m_dDynProfit = profit; }						///< 设置动态盈亏

	/*!
	 * \brief 获取持仓基础信息
	 * \details 用于获取持仓的基础数据
	 */
	inline WTSDirectionType getDirection() const{return m_direction;}						///< 获取持仓方向
	inline double	getPrePosition() const{ return m_dPrePosition; }						///< 获取昨仓数量
	inline double	getNewPosition() const{ return m_dNewPosition; }						///< 获取今仓数量
	inline double	getAvailPrePos() const{ return m_dAvailPrePos; }						///< 获取可用昨仓数量
	inline double	getAvailNewPos() const{ return m_dAvailNewPos; }						///< 获取可用今仓数量

	/*!
	 * \brief 计算总量和可用量
	 * \details 用于计算总持仓量和总可用量
	 */
	inline double	getTotalPosition() const{ return m_dPrePosition + m_dNewPosition; }		///< 获取总持仓量（昨仓+今仓）
	inline double	getAvailPosition() const{ return m_dAvailPrePos + m_dAvailNewPos; }		///< 获取总可用量

	/*!
	 * \brief 计算冻结数量
	 * \details 用于计算各种冻结的持仓数量
	 */
	inline double	getFrozenPosition() const{ return getTotalPosition() - getAvailPosition(); }	///< 获取总冻结数量
	inline double	getFrozenNewPos() const{ return m_dNewPosition - m_dAvailNewPos; }		///< 获取今仓冻结数量
	inline double	getFrozenPrePos() const{ return m_dPrePosition - m_dAvailPrePos; }		///< 获取昨仓冻结数量

	/*!
	 * \brief 获取成本和盈亏信息
	 * \details 用于获取持仓的成本、保证金和盈亏信息
	 */
	inline double		getPositionCost() const{ return m_dTotalPosCost; }					///< 获取持仓总成本
	inline double		getMargin() const{ return m_dMargin; }								///< 获取占用保证金
	inline double		getAvgPrice() const{ return m_dAvgPrice; }							///< 获取持仓均价
	inline double		getDynProfit() const{ return m_dDynProfit; }						///< 获取动态盈亏

	/*!
	 * \brief 获取标识信息
	 * \details 用于获取合约标识相关信息
	 */
	inline const char* getCode() const{ return m_strCode; }								///< 获取合约代码
	inline const char* getCurrency() const{ return m_strCurrency; }						///< 获取币种
	inline const char* getExchg() const{ return m_strExchg; }								///< 获取交易所代码

	/*!
	 * \brief 业务类型和合约信息
	 * \details 用于管理业务类型和关联的合约信息
	 */
	inline void setBusinessType(WTSBusinessType bType) { m_businessType = bType; }			///< 设置业务类型
	inline WTSBusinessType	getBusinessType() const { return m_businessType; }			///< 获取业务类型

	inline void setContractInfo(WTSContractInfo* cInfo) { m_pContract = cInfo; }			///< 设置合约信息
	inline WTSContractInfo* getContractInfo() const { return m_pContract; }				///< 获取合约信息

public:
	WTSPositionItem()
		: m_direction(WDT_LONG)
		, m_dPrePosition(0)
		, m_dNewPosition(0)
		, m_dAvailPrePos(0)
		, m_dAvailNewPos(0)
		, m_dMargin(0)
		, m_dAvgPrice(0)
		, m_dDynProfit(0)
		, m_dTotalPosCost(0)
		, m_businessType(BT_CASH)
		, m_pContract(NULL)
	{}
	virtual ~WTSPositionItem(){}

protected:
	char			m_strExchg[MAX_EXCHANGE_LENGTH];
	char			m_strCode[MAX_INSTRUMENT_LENGTH];
	char			m_strCurrency[8];

	WTSDirectionType	m_direction;//��շ���
	double		m_dPrePosition;		//���
	double		m_dNewPosition;		//���
	double		m_dAvailPrePos;		//��ƽ���
	double		m_dAvailNewPos;		//��ƽ���
	double		m_dTotalPosCost;	//�ֲ��ܳɱ�
	double		m_dMargin;			//ռ�ñ�֤��
	double		m_dAvgPrice;		//�ֲ־���
	double		m_dDynProfit;		//����ӯ��

	WTSBusinessType		m_businessType;
	WTSContractInfo*	m_pContract;
};

//////////////////////////////////////////////////////////////////////////
/*!
 * \brief 账户信息类
 * 
 * \details 用于管理和维护交易账户资金信息的类，包含：
 *          - 账户余额：总权益、可用资金、冻结资金等
 *          - 保证金管理：占用保证金、冻结保证金
 *          - 盈亏计算：平仓盈亏、持仓盈亏（动态盈亏）
 *          - 出入金管理：入金、出金记录
 *          - 手续费统计：总手续费、冻结手续费
 *          - 账户属性：币种、账户描述等
 *          
 *          该类提供完整的账户资金状态查询和管理功能，
 *          支持多币种账户，用于风险控制和资金监控。
 *          
 * \author Wesley
 * \date 2020/03/30
 */
class WTSAccountInfo : public WTSPoolObject<WTSAccountInfo>
{
public:
	WTSAccountInfo():m_strCurrency("CNY"){}
	virtual ~WTSAccountInfo(){}

public:
	/*!
	 * \brief 创建账户信息对象
	 * \return 账户信息对象指针
	 */
	static inline WTSAccountInfo* create(){return WTSAccountInfo::allocate();}

	/*!
	 * \brief 设置账户基础信息
	 * \details 用于设置账户的描述和币种信息
	 */
	inline void	setDescription(const char* desc){m_strDescription = desc;}				///< 设置账户描述
	inline void	setCurrency(const char* currency){ m_strCurrency = currency; }				///< 设置账户币种

	/*!
	 * \brief 设置账户资金信息
	 * \details 用于设置账户各项资金数据
	 */
	inline void	setBalance(double balance){m_uBalance = balance;}							///< 设置账户总权益
	inline void	setPreBalance(double prebalance){m_uPreBalance = prebalance;}				///< 设置昨日权益
	inline void	setMargin(double margin){m_uMargin = margin;}								///< 设置占用保证金
	inline void	setFrozenMargin(double frozenmargin){m_uFrozenMargin = frozenmargin;}		///< 设置冻结保证金
	inline void	setCloseProfit(double closeprofit){m_iCloseProfit = closeprofit;}			///< 设置平仓盈亏
	inline void	setDynProfit(double dynprofit){m_iDynProfit = dynprofit;}					///< 设置持仓盈亏（动态盈亏）
	inline void	setDeposit(double deposit){m_uDeposit = deposit;}							///< 设置入金金额
	inline void	setWithdraw(double withdraw){m_uWithdraw = withdraw;}						///< 设置出金金额
	inline void	setCommission(double commission){m_uCommission = commission;}				///< 设置总手续费
	inline void	setFrozenCommission(double frozencommission){m_uFrozenCommission = frozencommission;}	///< 设置冻结手续费
	inline void	setAvailable(double available){m_uAvailable = available;}					///< 设置可用资金

	/*!
	 * \brief 获取账户资金信息
	 * \details 用于获取账户各项资金数据
	 */
	inline double	getBalance() const{return m_uBalance;}									///< 获取账户总权益
	inline double	getPreBalance() const{return m_uPreBalance;}							///< 获取昨日权益
	inline double	getMargin() const{return m_uMargin;}									///< 获取占用保证金
	inline double	getFrozenMargin() const{return m_uFrozenMargin;}						///< 获取冻结保证金
	inline double	getCloseProfit() const{return m_iCloseProfit;}							///< 获取平仓盈亏
	inline double	getDynProfit() const{return m_iDynProfit;}								///< 获取持仓盈亏（动态盈亏）
	inline double	getDeposit() const{return m_uDeposit;}									///< 获取入金金额
	inline double	getWithdraw() const{return m_uWithdraw;}								///< 获取出金金额
	inline double	getCommission() const{return m_uCommission;}							///< 获取总手续费
	inline double	getFrozenCommission() const{return m_uFrozenCommission;}				///< 获取冻结手续费
	inline double	getAvailable() const{return m_uAvailable;}								///< 获取可用资金

	/*!
	 * \brief 获取账户基础信息
	 * \details 用于获取账户的描述和币种信息
	 */
	inline const char* getDescription() const{return m_strDescription.c_str();}			///< 获取账户描述
	inline const char* getCurrency() const{ return m_strCurrency.c_str(); }				///< 获取账户币种

protected:
	std::string	m_strDescription;
	std::string m_strCurrency;

	double		m_uBalance;
	double		m_uPreBalance;
	double		m_uMargin;
	double		m_uCommission;
	double		m_uFrozenMargin;
	double		m_uFrozenCommission;
	double		m_iCloseProfit;
	double		m_iDynProfit;
	double		m_uDeposit;
	double		m_uWithdraw;
	double		m_uAvailable;
};


NS_WTP_END
